from django.shortcuts import render
from appDevice.admin import User
from appDevice.admin import Device

# Create your views here.
from django.http import HttpResponse
import json
import time
from threading import Thread
from deviceTCPserver.deviceServerBaseQueue1 import C_queueServer
from queue import Queue

DEVICE_TYPE = {
  "ILmap" : 0,
  "Robor" : 1,
}
DEVICE_TYPE_NAME = {
  '0':"机器人" ,
  '1':"台灯" ,
  '2':"开关" ,
  '3':"热水器" ,
  '4':"" ,
}
DEVICE_SWITCH_STATE = {
  "ON" : 0,
  "OFF" :1,
}
DATATYPE = {
  "type_Switch" : 0,
  "type_Luminance" :1,
  "type_Color": 2,
}

DataType = DATATYPE["type_Switch"]
Topic = 1381234432110
Payload = {
  "USER_ID" : Topic,
  "Device_ID" : 1,
  #"DeviceType" : DEVICE_TYPE["ILmap"],
  "Device_Num" : 1,
  "DeviceSwitchState" : DEVICE_SWITCH_STATE["ON"],
  "Luminance": 1000,
  "Color": 50
}


loginFlag = {
  "login_success" :1 , #登录成功
  "wrong_userNumber" :2 , # 账号错误
  "wrong_password" :3, # 密码错误
  "其他错误" :4,
}

def deviceServer_post(queue="1381234432110", jsonData = "0"):
  wait_time = 5
  queue_recv_data = 'error'
  queueServer = C_queueServer()
  queueServer.queue_init_sand(queueName="DjangoPost")
  queueServer.queue_sand(datastr=jsonData, queueName="DjangoPost")
  queueServer.queue_init_rev(queueName=queue)
  postFIFO = Queue(maxsize=0) #maxsize设置队列中，数据上限，小于或等于0则不限制，容器中大于这个数则阻塞，直到队列中的数据被消掉
  '''
  def heartbeat():
      time.sleep(wait_time)
      try:
        queueServer.close_queue_rcev()
      except:
        print("关闭C_queueServer出现错误 设备不在线")
  thread_queue = Thread(target = heartbeat) # 设备发送数据给django 
  thread_queue.setDaemon(True)# 设置成守护线程
  thread_queue.start()
  '''
  try:
      def callback(v1,v2,v3,bodyx):
        postFIFO.put(bodyx)
        queueServer.close_queue_rcev()
      queueServer.queue_rev(func = callback, queueName=queue) # 阻塞
  except:
      queue_recv_data = 'error'
  try:
    queue_recv_data = postFIFO.get(block=True, timeout=2) # 阻塞方式接收获取数据 延时时间wait_time
    print(queue_recv_data)
  except:
    print("数据返回失败 结束")
    queue_recv_data = 'error'
  return queue_recv_data


def test_api(request):
    # 协议
    JsonProtocol = [{ "verision" : 1.0 , "userID":10000 , "userPassword": 12345 , "oneKey": 1 , "userPicture" : "none"}]
    return HttpResponse(json.dumps(JsonProtocol))  # 以字符串作为内容的HTTP响应类。可以读取、追加或替换此内容。 

def getGetDevice(request):
    # 协议
    if request.method == 'GET':
        #Payload['DeviceSwitchState'] = 1
        #Payload["Luminance"] = 1000
        #Payload["Color"] = 50
        JsonProtocol = [{ "Topic" : Topic , "Payload":Payload }]
        return HttpResponse(json.dumps(JsonProtocol))  # 以字符串作为内容的HTTP响应类。可以读取、追加或替换此内容。

def postLogin(request): # 用户注册和登录的通用的接口
  if request.method == "POST": # 再次检测是不是post请求
    json_result = json.loads(request.body) # json转换成字典
    print(json_result)
    
    User.objects.all()
    try:
      user = User.objects.get(s_userPhone=json_result["userID"])
      if(user.s_userPassword == json_result["password"]):
        JsonProtocol = [{ 
          "userName":user.s_userName,
          "userID": json_result["userID"],
          "password":json_result["password"],
          "loginFlag" : loginFlag["login_success"] ,
          "deviceNumber" : user.I_deviceNumber
        }] # 用户注册成功返回值
        print("用户登录成功") 
      else: # 用户的密码错误
        JsonProtocol = [{ "loginFlag" : loginFlag["wrong_password"]}] # 用户账号正确，密码错误
        print("用户的密码错误")   
    except: # 不存在账号错误，直接注册
      User.objects.create(
        s_userPhone = json_result["userID"],
        s_userName = json_result["userName"],
        s_userPassword = json_result["password"]
      )
      JsonProtocol = [{ 
        "userName":json_result["userName"],
        "userID": json_result["userID"],
        "password":json_result["password"],
        "loginFlag" : loginFlag["login_success"],
        "deviceNumber" : 0
      }] # 用户注册成功返回值
      print("用户注册成功")  

    return HttpResponse(json.dumps(JsonProtocol))
    
#############################################
# 名称 postSetDevice
# 时间 23.3
# 输入 请求主体字符串
# 输出 post请求返回字符串
# 作用 接收微信小程序发送过来的post请求 设置设备的运行状态 在此函数中 postSetDevice 仅仅负责将数据转发出去 不做任何处理
#############################################
def postSetDevice(request):
  print("设置设备状态")
  if request.method == 'POST':
      postBody = request.body
      json_result = json.loads(postBody) # 将字符串数据转换成字典
      print("postSetDevice:json_result:接收到的post请求", json_result)
      '''
      在post请求的返回值中返回设备的状态 在这里会通过阻塞5秒钟的时间来等待设备的数据
      在等待中是通过等待消息队列的数据来转发给对应的设备 匹配方式通过设备ID和用户ID
      '''
      ajsonStr = deviceServer_post(queue = "1381234432110", jsonData = postBody)
      print("设备服务器request请求返回: ",ajsonStr)
      return HttpResponse(ajsonStr) #dumps将字典转换成字符串发送出去
  else:
    pass

def postGetAddDeviceNum(request): # 用户添加设备按钮
  print("添加设备")
  User.objects.all()
  Device.objects.all()
  if request.method == "POST": # 再次检测是不是post请求
    json_result = json.loads(request.body) # json转换成字典
    print("用户t提交申请添加设备按钮",json_result)

    user = User.objects.get(s_userPhone=json_result["userID"]) # 根据用户小程序传递过来的账号和密码确定登录状态
    if(json_result["password"] == user.s_userPassword):
      print("登录成功")
      
      JsonProtocol = [{ # 需要返回给微信小程序的状态值
        "loginFlag" : loginFlag["login_success"]  ,
        "deviceNum":str(user.I_deviceNumber)
        }]
      print(user.I_deviceNumber)
    else:
      JsonProtocol = [{ "loginFlag" : loginFlag["wrong_password"] }] # 用户注册失败返回值
  return HttpResponse(json.dumps(JsonProtocol))

def postAddDevice(request): # 用户添加设备按钮
  print("添加设备")
  User.objects.all()
  Device.objects.all()
  if request.method == "POST": # 再次检测是不是post请求
    json_result = json.loads(request.body) # json转换成字典
    print("用户最终确认添加设备按钮",json_result)

    user = User.objects.get(s_userPhone=json_result["userID"]) # 根据用户小程序传递过来的账号和密码确定登录状态
    if(json_result["password"] == user.s_userPassword):
      print("登录成功")
      Device.objects.create( # 在数据库内创建一个数据存储该设备
        s_userPhoneFlag = user.s_userPhone+str(user.I_deviceNumber+1),
        s_deviceName = json_result["device"]["deviceName"],
        s_deviceType = json_result['device']["deviceType"],
        s_deviceOnline = '离线',
      )
      JsonProtocol = [{ # 需要返回给微信小程序的状态值
        "loginFlag" : loginFlag["login_success"]  ,
        "deviceNum":user.I_deviceNumber
        }]
      user.I_deviceNumber+=1 # 在数据库中，对用户的设备数量增加一个单位
      print(user.I_deviceNumber)
      user.save()
    else:
      JsonProtocol = [{ "loginFlag" : loginFlag["wrong_password"] }] # 用户注册失败返回值
  return HttpResponse(json.dumps(JsonProtocol))

def postGetDevice(request): # 用户获取自己的设备列表
  deviceList = []
  if request.method == "POST": # 再次检测是不是post请求
    json_result = json.loads(request.body) # json转换成字典
    print("用户获取自己的设备列表:",json_result)
    User.objects.all()
    Device.objects.all()
    user = User.objects.get(s_userPhone=json_result["userID"]) # 根据用户小程序传递过来的账号和密码确定登录状态
    if(json_result["password"] == user.s_userPassword):
      print("用户获取自己的设备列表 deviceNumber:",user.s_userPhone+str(user.I_deviceNumber))
      
      for i in range(user.I_deviceNumber) :
        print("s_userPhoneFlag=",user.s_userPhone+str(i+1))
        device = Device.objects.get(s_userPhoneFlag=user.s_userPhone+str(i+1))
        deviceList.append({
        "userPhoneFlag":device.s_userPhoneFlag,
        "deviceName":device.s_deviceName,
        "deviceType":DEVICE_TYPE_NAME[device.s_deviceType], ########################## DEVICE_TYPE_NAME[]
        "deviceOnline":device.s_deviceOnline 
        })
    
      JsonProtocol = [{ 
      "loginFlag" : loginFlag["login_success"] ,
      "deviceNum": user.I_deviceNumber,
      "deviceList":deviceList,
      }] 
    else:
      JsonProtocol = [{ "loginFlag" : loginFlag["wrong_password"] }] # 
      print("密码错误！！")
    return HttpResponse(json.dumps(JsonProtocol))

